﻿using Microsoft.OpenApi.Models;

namespace Zhao.Arena.Utility.SwaggerExt
{
    /// <summary>
    /// 如果将各种配置都写在 Program中会出现代码过多的情况可以将swagger封装成一个静态的方法
    /// </summary>
    public static class CustiomSwaggerExt
    {
        /// <summary>
        /// 配置swagger
        /// 这是一个扩展方法 可以直接使用 Program中的builder调用
        /// </summary>
        /// <param name="builder"></param>
        public static void AddSwaggerExt(this WebApplicationBuilder builder)
        {
            builder.Services.AddEndpointsApiExplorer();
            //使用委托来进行配置swagger
            builder.Services.AddSwaggerGen(options =>
            {
                //使用循环便利枚举来进行版本配置
                typeof(ApiVersions).GetEnumNames().ToList().ForEach(version =>
                {
                    //使用options来进行配置
                    options.SwaggerDoc(version, new OpenApiInfo()
                    {
                        Title = "球馆后台", //标题
                        Version = version,//版本号
                        Description = $"通用版本的CoreApi版本{version}"//版本说明
                    });
                });

                //使当配置生效
                //xml文档的绝对路径  AppContext.BaseDirectory(当前项目运行目录)，第二个参数xml配置文件名称
                var file = Path.Combine(AppContext.BaseDirectory, "Zhao.Arena.xml");
                //true：显示控制器层注释
                options.IncludeXmlComments(file, true);

                ////对action的名称进行排序，如果有多和，就可以看见效果。
                //options.OrderActionsBy(o => o.RelativePath);

                //添加安全定义
                options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
                {
                    Description = "请输入token,格式为 Bearer xxxxxxxx（注意中间必须有空格）",
                    Name = "Authorization",
                    In = ParameterLocation.Header,
                    Type = SecuritySchemeType.ApiKey,
                    BearerFormat = "JWT",
                    Scheme = "Bearer"
                });

                //添加安全要求
                options.AddSecurityRequirement(new OpenApiSecurityRequirement
                {
                  {
                        new OpenApiSecurityScheme
                        {
                            Reference =new OpenApiReference()
                            {
                                Type = ReferenceType.SecurityScheme,
                                Id ="Bearer"
                            }
                        },
                        new string[]{ }
                    }
                });
            });
        }

        /// <summary>
        /// 启用swagger
        /// 这是一个扩展方法 可以直接使用 Program中的app调用
        /// </summary>
        /// <param name="app"></param>
        public static void UserSgwaagerExt(this WebApplication app)
        {
            app.UseSwagger();
            //启用swagerr服务
            app.UseSwaggerUI(options =>
            {
                //循环
                foreach (string version in typeof(ApiVersions).GetEnumNames())
                {
                    options.SwaggerEndpoint($"/swagger/{version}/swagger.json", $"通用版本的CoreApi版本{version}");
                }
            });
        }
    }
}
